home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / bc-1_02.lha / bc-1.02 / bc.c.dist < prev    next >
Text File  |  1992-03-04  |  44KB  |  1,370 lines

  1. #ifndef lint
  2. static char yysccsid[] = "@(#)yaccpar    1.8 (Berkeley) 01/20/90";
  3. #endif
  4. #define YYBYACC 1
  5. #line 2 "bc.y"
  6. /* bc.y: The grammar for a POSIX compatable bc processor with some
  7.          extensions to the language. */
  8.  
  9. /*  This file is part of bc written for MINIX.
  10.     Copyright (C) 1991, 1992 Free Software Foundation, Inc.
  11.  
  12.     This program is free software; you can redistribute it and/or modify
  13.     it under the terms of the GNU General Public License as published by
  14.     the Free Software Foundation; either version 2 of the License , or
  15.     (at your option) any later version.
  16.  
  17.     This program is distributed in the hope that it will be useful,
  18.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.     GNU General Public License for more details.
  21.  
  22.     You should have received a copy of the GNU General Public License
  23.     along with this program; see the file COPYING.  If not, write to
  24.     the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  
  26.     You may contact the author by:
  27.        e-mail:  phil@cs.wwu.edu
  28.       us-mail:  Philip A. Nelson
  29.                 Computer Science Department, 9062
  30.                 Western Washington University
  31.                 Bellingham, WA 98226-9062
  32.        
  33. *************************************************************************/
  34.  
  35. #include "bcdefs.h"
  36. #include "global.h"
  37. #include "proto.h"
  38. #line 38 "bc.y"
  39. typedef union {
  40.     char     *s_value;
  41.     char      c_value;
  42.     int      i_value;
  43.     arg_list *a_value;
  44.        } YYSTYPE;
  45. #line 46 "y.tab.c"
  46. #define NEWLINE 257
  47. #define AND 258
  48. #define OR 259
  49. #define NOT 260
  50. #define STRING 261
  51. #define NAME 262
  52. #define NUMBER 263
  53. #define MUL_OP 264
  54. #define ASSIGN_OP 265
  55. #define REL_OP 266
  56. #define INCR_DECR 267
  57. #define Define 268
  58. #define Break 269
  59. #define Quit 270
  60. #define Length 271
  61. #define Return 272
  62. #define For 273
  63. #define If 274
  64. #define While 275
  65. #define Sqrt 276
  66. #define Else 277
  67. #define Scale 278
  68. #define Ibase 279
  69. #define Obase 280
  70. #define Auto 281
  71. #define Read 282
  72. #define Warranty 283
  73. #define Halt 284
  74. #define Last 285
  75. #define Continue 286
  76. #define Print 287
  77. #define Limits 288
  78. #define UNARY_MINUS 289
  79. #define YYERRCODE 256
  80. short yylhs[] = {                                        -1,
  81.     0,    0,   10,   10,   10,   11,   11,   11,   11,   12,
  82.    12,   12,   12,   12,   12,   15,   15,   13,   13,   13,
  83.    13,   13,   13,   13,   13,   13,   13,   16,   17,   18,
  84.    19,   13,   20,   13,   22,   23,   13,   13,   25,   13,
  85.    24,   24,   26,   26,   21,   27,   21,   28,   14,    5,
  86.     5,    6,    6,    6,    7,    7,    7,    7,    8,    8,
  87.     9,    9,    9,    9,    4,    4,    2,    2,   29,    1,
  88.    30,    1,   31,    1,    1,    1,    1,    1,    1,    1,
  89.     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  90.     1,    3,    3,    3,    3,    3,    3,
  91. };
  92. short yylen[] = {                                         2,
  93.     0,    2,    2,    1,    2,    0,    1,    3,    2,    0,
  94.     1,    2,    3,    2,    3,    1,    2,    1,    1,    1,
  95.     1,    1,    1,    1,    1,    1,    4,    0,    0,    0,
  96.     0,   13,    0,    7,    0,    0,    7,    3,    0,    3,
  97.     1,    3,    1,    1,    0,    0,    3,    0,   12,    0,
  98.     1,    0,    3,    3,    1,    3,    3,    5,    0,    1,
  99.     1,    3,    3,    5,    0,    1,    0,    1,    0,    4,
  100.     0,    4,    0,    4,    2,    3,    3,    3,    3,    3,
  101.     2,    1,    1,    3,    4,    2,    2,    4,    4,    4,
  102.     3,    1,    4,    1,    1,    1,    1,
  103. };
  104. short yydefred[] = {                                      1,
  105.     0,    0,    0,   21,    0,   83,    0,    0,   22,   24,
  106.     0,    0,   28,    0,   35,    0,    0,   94,   95,    0,
  107.    18,   25,   97,   23,   39,   19,    0,    0,    0,    0,
  108.     0,    2,    0,   16,    4,    7,    5,   17,    0,    0,
  109.     0,    0,   96,   86,    0,    0,    0,    0,    0,    0,
  110.     0,    0,    0,    0,   81,    0,    0,    0,   11,   71,
  111.    73,    0,    0,    0,    0,    0,   69,   87,    3,    0,
  112.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  113.     0,    0,    0,    0,   91,   43,    0,   40,    0,   84,
  114.     0,    0,   38,    0,    0,    0,    0,    0,    0,    0,
  115.     0,    8,    0,   85,    0,   93,    0,    0,    0,   88,
  116.    27,    0,    0,   33,    0,   89,   90,    0,   13,   15,
  117.     0,    0,    0,   62,    0,    0,    0,    0,    0,   29,
  118.     0,    0,   42,    0,   56,    0,    0,    0,    0,    0,
  119.    64,    0,    0,    0,   46,   34,   37,    0,   48,   58,
  120.    30,    0,    0,    0,    0,   47,   53,   54,    0,    0,
  121.     0,   31,   49,    0,   32,
  122. };
  123. short yydgoto[] = {                                       1,
  124.    30,   79,   31,  113,  108,  149,  109,   73,   74,   32,
  125.    33,   58,   34,   35,   59,   48,  138,  155,  164,  131,
  126.   146,   50,  132,   88,   54,   89,  152,  154,  101,   94,
  127.    95,
  128. };
  129. short yysindex[] = {                                      0,
  130.    -7,   58,  212,    0,  -22,    0, -233, -241,    0,    0,
  131.    -8,   -5,    0,   -4,    0,    2,    4,    0,    0,    9,
  132.     0,    0,    0,    0,    0,    0,  212,  212,   91,  725,
  133.  -240,    0,  -29,    0,    0,    0,    0,    0,   84,  245,
  134.   212,  -57,    0,    0,   10,  212,  212,   14,  212,   16,
  135.   212,  212,   23,  156,    0,  549,  127,  -52,    0,    0,
  136.     0,  212,  212,  212,  212,  212,    0,    0,    0,   91,
  137.   -17,  725,   24,   -3,  578, -205,  562,  725,   27,  212,
  138.   606,  212,  669,  716,    0,    0,  725,    0,   19,    0,
  139.    91,  127,    0,  212,  212,  -36,  -39,  -91,  -91,  -36,
  140.   212,    0,  166,    0,  277,    0,  -21,   36,   40,    0,
  141.     0,  725,   28,    0,  725,    0,    0,  156,    0,    0,
  142.    84,  540,  -39,    0,   -9,  725,   -2,  -37, -174,    0,
  143.   127,   48,    0,  346,    0, -167,    3,  212, -185,  127,
  144.     0, -188,    6,   37,    0,    0,    0, -205,    0,    0,
  145.     0,  127,  -42,   91,  212,    0,    0,    0,  -20,   54,
  146.    26,    0,    0,  127,    0,
  147. };
  148. short yyrindex[] = {                                      0,
  149.   -16,    0,    0,    0,  409,    0,    0,    0,    0,    0,
  150.     0,  -58,    0,    0,    0,    0,  426,    0,    0,    0,
  151.     0,    0,    0,    0,    0,    0,    0,    0,  -50,   46,
  152.   470,    0,    0,    0,    0,    0,    0,    0,  661,   56,
  153.     0,  525,    0,    0,    0,    0,   59,    0,    0,    0,
  154.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  155.     0,    0,    0,    0,    0,    0,    0,    0,    0,   -6,
  156.   705,    7,    0,   60,    0,   61,    0,   63,    0,   49,
  157.     0,    0,    0,    0,    0,    0,   17,    0,   78,    0,
  158.   -47,  -45,    0,    0,    0,  537,  440,  620,  637,  594,
  159.     0,    0,    0,    0,    0,    0,  -33,    0,   66,    0,
  160.     0,  -19,    0,    0,   68,    0,    0,    0,    0,    0,
  161.   667,  680,  508,    0,  705,   18,    0,    0,    0,    0,
  162.     0,    0,    0,    0,    0,    0,  -31,   49,  -44,    0,
  163.     0,  -40,    0,    0,    0,    0,    0,    0,    0,    0,
  164.     0,    0,    0,    1,   69,    0,    0,    0,    0,    0,
  165.    13,    0,    0,    0,    0,
  166. };
  167. short yygindex[] = {                                      0,
  168.   958,    0,  104, -118,    0,    0,  -35,    0,    0,    0,
  169.     0,  -34,   22,    0,   15,    0,    0,    0,    0,    0,
  170.     0,    0,    0,   -1,    0,    0,    0,    0,    0,    0,
  171.     0,
  172. };
  173. #define YYTABLESIZE 1113
  174. short yytable[] = {                                      52,
  175.    26,  129,   66,   64,   52,   65,   92,   55,   10,   57,
  176.    55,   12,   57,   14,   45,   36,  158,   40,   52,  144,
  177.    45,   66,   40,   38,   67,   55,   68,   57,   42,   70,
  178.    40,   46,   28,   41,   47,   49,  160,   27,   92,   66,
  179.   105,   51,    6,   52,   43,   18,   19,   61,   53,   76,
  180.    61,   23,    9,   80,   66,   82,  107,   66,   63,   10,
  181.    44,   63,  118,   85,  104,   28,   26,  111,   41,  127,
  182.    27,   12,   93,  103,   10,   44,  128,   12,   38,   14,
  183.    45,  134,   52,  129,  102,  136,  130,  137,  140,  142,
  184.   135,  145,  148,  143,  162,  151,   59,   28,  150,   67,
  185.    60,   50,   27,   68,   20,  119,   51,   65,   36,   65,
  186.    44,    0,  153,  120,    0,   29,  133,    0,    0,  159,
  187.     0,    0,    0,    0,    0,    0,   64,    0,   65,    0,
  188.    28,    0,    0,    0,    0,   27,   41,    0,    0,    0,
  189.     0,   44,    0,    0,    0,    0,    0,    0,   29,    0,
  190.   163,    0,  139,    0,    0,    0,    0,    0,    0,    0,
  191.     0,  147,    0,    0,    0,    0,   28,    0,    0,    0,
  192.    20,   27,   62,  156,    0,  119,    0,   66,    0,    0,
  193.    29,    0,    0,    0,    0,  165,    0,    0,    0,    0,
  194.     0,    0,    0,    0,    0,   28,    0,    0,   26,    0,
  195.    27,    0,   41,    0,   91,   28,   10,    0,    0,   12,
  196.    27,   14,   45,   29,  157,   52,   52,    0,   26,   52,
  197.    52,   52,   52,   55,   62,   57,   52,   69,   52,   52,
  198.    52,   52,   52,   52,   52,   52,  161,   52,   52,   52,
  199.     6,   52,   52,   52,   52,   52,   52,   52,    2,   29,
  200.     9,   28,    3,    4,    5,    6,   27,   10,  124,    7,
  201.     8,    9,   10,   11,   12,   13,   14,   15,   16,   12,
  202.    17,   18,   19,   44,   20,   21,   22,   23,   24,   25,
  203.    26,   57,    0,    0,   28,    3,    4,    5,    6,   27,
  204.     0,    0,    7,   44,    9,   10,   11,   12,   13,   14,
  205.    15,   16,   20,   17,   18,   19,    0,   20,   21,   22,
  206.    23,   24,   25,   26,   37,    0,   28,    3,    4,    5,
  207.     6,   27,   20,    0,    7,    0,    9,   10,   11,   12,
  208.    13,   14,   15,   16,   41,   17,   18,   19,    0,   20,
  209.    21,   22,   23,   24,   25,   26,   57,   62,    0,   63,
  210.     3,    4,    5,    6,   41,    0,    0,    7,    0,    9,
  211.    10,   11,   12,   13,   14,   15,   16,    0,   17,   18,
  212.    19,    0,   20,   21,   22,   23,   24,   25,   26,    0,
  213.     0,    0,    0,    0,    0,   28,    3,    4,    5,    6,
  214.    27,    0,    0,    7,    0,    9,   10,   11,   12,   13,
  215.    14,   15,   16,    0,   17,   18,   19,    0,   20,   21,
  216.    22,   23,   24,   25,   26,    3,   86,    5,    6,    0,
  217.     0,    0,    7,    0,    0,    3,   11,    5,    6,    0,
  218.     0,   16,    7,   17,   18,   19,   11,   20,  141,    0,
  219.    23,   16,    0,   17,   18,   19,    0,   20,    0,   92,
  220.    23,   92,   92,   92,    0,    0,    0,    0,    0,    0,
  221.     0,    0,    0,    0,    0,    0,   96,   92,   96,   96,
  222.    96,    3,    0,    5,    6,    0,    0,    0,    7,    0,
  223.    76,    0,   11,   76,   96,    0,    0,   16,    0,   17,
  224.    18,   19,    0,   20,    0,    0,   23,    0,   76,    0,
  225.     0,   92,   92,    0,    3,    0,   71,    6,    0,    0,
  226.    82,    7,   82,   82,   82,   11,    0,    0,   96,   96,
  227.    16,    0,   17,   18,   19,    0,   20,    0,   82,   23,
  228.     0,    0,   76,   92,    0,    0,    3,    0,  125,    6,
  229.     0,    0,    0,    7,    0,    0,    0,   11,   70,    0,
  230.    96,   70,   16,    0,   17,   18,   19,    0,   20,    0,
  231.     0,   23,   82,   82,   76,   92,   70,   92,   92,   92,
  232.     0,    0,    0,    0,    0,    0,    0,   79,    0,   79,
  233.    79,   79,   64,   92,   65,    0,    0,    0,    0,   90,
  234.     0,   64,    0,   65,   82,   79,    0,    0,    0,    0,
  235.    70,    0,  110,    0,   64,    3,   65,    5,    6,    0,
  236.     0,    0,    7,    0,    0,    0,   11,   92,   92,    0,
  237.    64,   16,   65,   17,   18,   19,    0,   20,    0,   79,
  238.    23,    0,   70,   66,   80,    0,   80,   80,   80,    0,
  239.     0,    0,   66,    0,    0,    0,  114,    0,   64,   92,
  240.    65,    0,   80,    0,    0,   66,    0,    0,    0,    0,
  241.    77,   79,   77,   77,   77,   92,   92,   92,    0,    0,
  242.   106,   66,   92,   92,   92,   92,    0,   78,   77,   78,
  243.    78,   78,   96,   96,   96,   92,   80,    0,    0,   96,
  244.    96,   96,   96,    0,    0,   78,   76,   76,   76,   66,
  245.     0,   75,   96,    0,   75,   76,    0,   72,    0,  116,
  246.    72,   64,   77,   65,    0,    0,   76,    0,   80,   75,
  247.    74,    0,    0,   74,    0,   72,   82,   82,   82,   78,
  248.     0,    0,    0,   82,    0,   82,    0,    0,   74,    0,
  249.     0,    0,    0,    0,   77,   92,   82,   92,   92,   92,
  250.     0,    0,    0,   75,    0,    0,  117,    0,   64,   72,
  251.    65,   78,   66,    0,   70,   70,   70,   64,    0,   65,
  252.     0,    0,   74,   70,    0,    0,    0,    0,    0,    0,
  253.     0,   92,   92,   92,   70,   75,    0,    0,   92,    0,
  254.    92,   72,    0,   79,   79,   79,    0,   60,   92,    0,
  255.    79,   92,   79,   62,   74,   63,   60,   61,    0,   66,
  256.     0,    0,   62,   79,   63,    0,    0,    0,   66,   60,
  257.    61,    0,    0,    0,    0,   62,    0,   63,    0,    0,
  258.     0,    0,    0,    0,    0,   60,   61,    0,    0,    0,
  259.     0,   62,    0,   63,    0,    0,    0,    0,    0,    0,
  260.    80,   80,   80,    0,    0,    0,    0,   80,    0,   80,
  261.     0,    0,    0,   60,   61,    0,    0,    0,    0,   62,
  262.    80,   63,    0,    0,    0,    0,   77,   77,   77,    0,
  263.     0,    0,    0,    0,    0,   77,    0,    0,    0,    0,
  264.     0,    0,    0,   78,   78,   78,   77,    0,    0,    0,
  265.     0,    0,   78,    0,    0,    0,    0,    0,    0,    0,
  266.     0,    0,    0,   78,    0,    0,    0,   75,   75,   75,
  267.     0,    0,    0,   72,   72,   72,   60,   61,    0,    0,
  268.     0,    0,   62,    0,   63,    0,   74,   75,   74,    0,
  269.     0,    0,    0,   72,    0,    0,    0,    0,    0,    0,
  270.     0,    0,    0,    0,    0,    0,   74,    0,    0,    0,
  271.    39,    0,   92,   92,    0,    0,    0,    0,   92,   92,
  272.    92,   92,    0,   60,   61,    0,    0,    0,    0,   62,
  273.     0,   63,   60,   61,   55,   56,    0,    0,   62,    0,
  274.    63,    0,    0,    0,    0,    0,    0,   72,   75,    0,
  275.     0,    0,    0,   77,   78,    0,   81,    0,   83,   84,
  276.     0,   87,    0,    0,    0,    0,    0,    0,    0,   96,
  277.    97,   98,   99,  100,    0,    0,    0,    0,    0,    0,
  278.     0,    0,    0,    0,    0,    0,    0,  112,    0,  115,
  279.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  280.     0,  121,  122,    0,    0,    0,    0,    0,  123,    0,
  281.    75,    0,  126,    0,    0,    0,    0,    0,    0,    0,
  282.     0,    0,    0,    0,    0,   87,    0,    0,    0,    0,
  283.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  284.     0,   75,    0,    0,    0,  112,    0,    0,    0,    0,
  285.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  286.     0,    0,  112,
  287. };
  288. short yycheck[] = {                                      40,
  289.    59,   44,   94,   43,   45,   45,   59,   41,   59,   41,
  290.    44,   59,   44,   59,   59,    1,   59,   40,   59,  138,
  291.   262,   41,   40,    2,  265,   59,  267,   59,  262,   59,
  292.    40,   40,   40,   91,   40,   40,  155,   45,   59,   59,
  293.    44,   40,   59,   40,  278,  279,  280,   41,   40,   40,
  294.    44,  285,   59,   40,   94,   40,  262,   94,   41,   59,
  295.    44,   44,   44,   41,   41,   40,  125,   41,   91,   91,
  296.    45,   59,  125,   91,  125,   59,   41,  125,   57,  125,
  297.   125,   91,  123,   44,   70,  123,   59,  262,   41,  257,
  298.    93,  277,  281,   91,   41,   59,   41,   40,   93,   41,
  299.    41,   41,   45,   41,   59,   91,   41,   59,   41,   41,
  300.     7,   -1,  148,   92,   -1,  123,  118,   -1,   -1,  154,
  301.    -1,   -1,   -1,   -1,   -1,   -1,   43,   -1,   45,   -1,
  302.    40,   -1,   -1,   -1,   -1,   45,   59,   -1,   -1,   -1,
  303.    -1,  125,   -1,   -1,   -1,   -1,   -1,   -1,  123,   -1,
  304.   125,   -1,  131,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  305.    -1,  140,   -1,   -1,   -1,   -1,   40,   -1,   -1,   -1,
  306.   125,   45,  264,  152,   -1,  161,   -1,   94,   -1,   -1,
  307.   123,   -1,   -1,   -1,   -1,  164,   -1,   -1,   -1,   -1,
  308.    -1,   -1,   -1,   -1,   -1,   40,   -1,   -1,  257,   -1,
  309.    45,   -1,  125,   -1,  257,   40,  257,   -1,   -1,  257,
  310.    45,  257,  257,  123,  257,  256,  257,   -1,  277,  260,
  311.   261,  262,  263,  257,  264,  257,  267,  257,  269,  270,
  312.   271,  272,  273,  274,  275,  276,  257,  278,  279,  280,
  313.   257,  282,  283,  284,  285,  286,  287,  288,  256,  123,
  314.   257,   40,  260,  261,  262,  263,   45,  257,   93,  267,
  315.   268,  269,  270,  271,  272,  273,  274,  275,  276,  257,
  316.   278,  279,  280,  257,  282,  283,  284,  285,  286,  287,
  317.   288,  256,   -1,   -1,   40,  260,  261,  262,  263,   45,
  318.    -1,   -1,  267,  277,  269,  270,  271,  272,  273,  274,
  319.   275,  276,  257,  278,  279,  280,   -1,  282,  283,  284,
  320.   285,  286,  287,  288,  257,   -1,   40,  260,  261,  262,
  321.   263,   45,  277,   -1,  267,   -1,  269,  270,  271,  272,
  322.   273,  274,  275,  276,  257,  278,  279,  280,   -1,  282,
  323.   283,  284,  285,  286,  287,  288,  256,  264,   -1,  266,
  324.   260,  261,  262,  263,  277,   -1,   -1,  267,   -1,  269,
  325.   270,  271,  272,  273,  274,  275,  276,   -1,  278,  279,
  326.   280,   -1,  282,  283,  284,  285,  286,  287,  288,   -1,
  327.    -1,   -1,   -1,   -1,   -1,   40,  260,  261,  262,  263,
  328.    45,   -1,   -1,  267,   -1,  269,  270,  271,  272,  273,
  329.   274,  275,  276,   -1,  278,  279,  280,   -1,  282,  283,
  330.   284,  285,  286,  287,  288,  260,  261,  262,  263,   -1,
  331.    -1,   -1,  267,   -1,   -1,  260,  271,  262,  263,   -1,
  332.    -1,  276,  267,  278,  279,  280,  271,  282,   93,   -1,
  333.   285,  276,   -1,  278,  279,  280,   -1,  282,   -1,   41,
  334.   285,   43,   44,   45,   -1,   -1,   -1,   -1,   -1,   -1,
  335.    -1,   -1,   -1,   -1,   -1,   -1,   41,   59,   43,   44,
  336.    45,  260,   -1,  262,  263,   -1,   -1,   -1,  267,   -1,
  337.    41,   -1,  271,   44,   59,   -1,   -1,  276,   -1,  278,
  338.   279,  280,   -1,  282,   -1,   -1,  285,   -1,   59,   -1,
  339.    -1,   93,   94,   -1,  260,   -1,  262,  263,   -1,   -1,
  340.    41,  267,   43,   44,   45,  271,   -1,   -1,   93,   94,
  341.   276,   -1,  278,  279,  280,   -1,  282,   -1,   59,  285,
  342.    -1,   -1,   93,  125,   -1,   -1,  260,   -1,  262,  263,
  343.    -1,   -1,   -1,  267,   -1,   -1,   -1,  271,   41,   -1,
  344.   125,   44,  276,   -1,  278,  279,  280,   -1,  282,   -1,
  345.    -1,  285,   93,   94,  125,   41,   59,   43,   44,   45,
  346.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   43,
  347.    44,   45,   43,   59,   45,   -1,   -1,   -1,   -1,   41,
  348.    -1,   43,   -1,   45,  125,   59,   -1,   -1,   -1,   -1,
  349.    93,   -1,   41,   -1,   43,  260,   45,  262,  263,   -1,
  350.    -1,   -1,  267,   -1,   -1,   -1,  271,   93,   94,   -1,
  351.    43,  276,   45,  278,  279,  280,   -1,  282,   -1,   93,
  352.   285,   -1,  125,   94,   41,   -1,   43,   44,   45,   -1,
  353.    -1,   -1,   94,   -1,   -1,   -1,   41,   -1,   43,  125,
  354.    45,   -1,   59,   -1,   -1,   94,   -1,   -1,   -1,   -1,
  355.    41,  125,   43,   44,   45,  257,  258,  259,   -1,   -1,
  356.    93,   94,  264,  265,  266,  267,   -1,   41,   59,   43,
  357.    44,   45,  257,  258,  259,  277,   93,   -1,   -1,  264,
  358.   265,  266,  267,   -1,   -1,   59,  257,  258,  259,   94,
  359.    -1,   41,  277,   -1,   44,  266,   -1,   41,   -1,   41,
  360.    44,   43,   93,   45,   -1,   -1,  277,   -1,  125,   59,
  361.    41,   -1,   -1,   44,   -1,   59,  257,  258,  259,   93,
  362.    -1,   -1,   -1,  264,   -1,  266,   -1,   -1,   59,   -1,
  363.    -1,   -1,   -1,   -1,  125,   41,  277,   43,   44,   45,
  364.    -1,   -1,   -1,   93,   -1,   -1,   41,   -1,   43,   93,
  365.    45,  125,   94,   -1,  257,  258,  259,   43,   -1,   45,
  366.    -1,   -1,   93,  266,   -1,   -1,   -1,   -1,   -1,   -1,
  367.    -1,  257,  258,  259,  277,  125,   -1,   -1,  264,   -1,
  368.   266,  125,   -1,  257,  258,  259,   -1,  258,   94,   -1,
  369.   264,  277,  266,  264,  125,  266,  258,  259,   -1,   94,
  370.    -1,   -1,  264,  277,  266,   -1,   -1,   -1,   94,  258,
  371.   259,   -1,   -1,   -1,   -1,  264,   -1,  266,   -1,   -1,
  372.    -1,   -1,   -1,   -1,   -1,  258,  259,   -1,   -1,   -1,
  373.    -1,  264,   -1,  266,   -1,   -1,   -1,   -1,   -1,   -1,
  374.   257,  258,  259,   -1,   -1,   -1,   -1,  264,   -1,  266,
  375.    -1,   -1,   -1,  258,  259,   -1,   -1,   -1,   -1,  264,
  376.   277,  266,   -1,   -1,   -1,   -1,  257,  258,  259,   -1,
  377.    -1,   -1,   -1,   -1,   -1,  266,   -1,   -1,   -1,   -1,
  378.    -1,   -1,   -1,  257,  258,  259,  277,   -1,   -1,   -1,
  379.    -1,   -1,  266,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  380.    -1,   -1,   -1,  277,   -1,   -1,   -1,  257,  258,  259,
  381.    -1,   -1,   -1,  257,  258,  259,  258,  259,   -1,   -1,
  382.    -1,   -1,  264,   -1,  266,   -1,  257,  277,  259,   -1,
  383.    -1,   -1,   -1,  277,   -1,   -1,   -1,   -1,   -1,   -1,
  384.    -1,   -1,   -1,   -1,   -1,   -1,  277,   -1,   -1,   -1,
  385.     3,   -1,  258,  259,   -1,   -1,   -1,   -1,  264,  265,
  386.   266,  267,   -1,  258,  259,   -1,   -1,   -1,   -1,  264,
  387.    -1,  266,  258,  259,   27,   28,   -1,   -1,  264,   -1,
  388.   266,   -1,   -1,   -1,   -1,   -1,   -1,   40,   41,   -1,
  389.    -1,   -1,   -1,   46,   47,   -1,   49,   -1,   51,   52,
  390.    -1,   54,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   62,
  391.    63,   64,   65,   66,   -1,   -1,   -1,   -1,   -1,   -1,
  392.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   80,   -1,   82,
  393.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  394.    -1,   94,   95,   -1,   -1,   -1,   -1,   -1,  101,   -1,
  395.   103,   -1,  105,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  396.    -1,   -1,   -1,   -1,   -1,  118,   -1,   -1,   -1,   -1,
  397.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  398.    -1,  134,   -1,   -1,   -1,  138,   -1,   -1,   -1,   -1,
  399.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  400.    -1,   -1,  155,
  401. };
  402. #define YYFINAL 1
  403. #ifndef YYDEBUG
  404. #define YYDEBUG 0
  405. #endif
  406. #define YYMAXTOKEN 289
  407. #if YYDEBUG
  408. char *yyname[] = {
  409. "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  410. 0,0,0,0,0,0,"'('","')'",0,"'+'","','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0,0,
  411. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0,
  412. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'",0,0,0,0,0,0,
  413. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  414. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  415. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  416. 0,0,0,0,0,"NEWLINE","AND","OR","NOT","STRING","NAME","NUMBER","MUL_OP",
  417. "ASSIGN_OP","REL_OP","INCR_DECR","Define","Break","Quit","Length","Return",
  418. "For","If","While","Sqrt","Else","Scale","Ibase","Obase","Auto","Read",
  419. "Warranty","Halt","Last","Continue","Print","Limits","UNARY_MINUS",
  420. };
  421. char *yyrule[] = {
  422. "$accept : program",
  423. "program :",
  424. "program : program input_item",
  425. "input_item : semicolon_list NEWLINE",
  426. "input_item : function",
  427. "input_item : error NEWLINE",
  428. "semicolon_list :",
  429. "semicolon_list : statement_or_error",
  430. "semicolon_list : semicolon_list ';' statement_or_error",
  431. "semicolon_list : semicolon_list ';'",
  432. "statement_list :",
  433. "statement_list : statement_or_error",
  434. "statement_list : statement_list NEWLINE",
  435. "statement_list : statement_list NEWLINE statement_or_error",
  436. "statement_list : statement_list ';'",
  437. "statement_list : statement_list ';' statement",
  438. "statement_or_error : statement",
  439. "statement_or_error : error statement",
  440. "statement : Warranty",
  441. "statement : Limits",
  442. "statement : expression",
  443. "statement : STRING",
  444. "statement : Break",
  445. "statement : Continue",
  446. "statement : Quit",
  447. "statement : Halt",
  448. "statement : Return",
  449. "statement : Return '(' return_expression ')'",
  450. "$$1 :",
  451. "$$2 :",
  452. "$$3 :",
  453. "$$4 :",
  454. "statement : For $$1 '(' opt_expression ';' $$2 opt_expression ';' $$3 opt_expression ')' $$4 statement",
  455. "$$5 :",
  456. "statement : If '(' expression ')' $$5 statement opt_else",
  457. "$$6 :",
  458. "$$7 :",
  459. "statement : While $$6 '(' expression $$7 ')' statement",
  460. "statement : '{' statement_list '}'",
  461. "$$8 :",
  462. "statement : Print $$8 print_list",
  463. "print_list : print_element",
  464. "print_list : print_element ',' print_list",
  465. "print_element : STRING",
  466. "print_element : expression",
  467. "opt_else :",
  468. "$$9 :",
  469. "opt_else : Else $$9 statement",
  470. "$$10 :",
  471. "function : Define NAME '(' opt_parameter_list ')' '{' NEWLINE opt_auto_define_list $$10 statement_list NEWLINE '}'",
  472. "opt_parameter_list :",
  473. "opt_parameter_list : define_list",
  474. "opt_auto_define_list :",
  475. "opt_auto_define_list : Auto define_list NEWLINE",
  476. "opt_auto_define_list : Auto define_list ';'",
  477. "define_list : NAME",
  478. "define_list : NAME '[' ']'",
  479. "define_list : define_list ',' NAME",
  480. "define_list : define_list ',' NAME '[' ']'",
  481. "opt_argument_list :",
  482. "opt_argument_list : argument_list",
  483. "argument_list : expression",
  484. "argument_list : NAME '[' ']'",
  485. "argument_list : argument_list ',' expression",
  486. "argument_list : argument_list ',' NAME '[' ']'",
  487. "opt_expression :",
  488. "opt_expression : expression",
  489. "return_expression :",
  490. "return_expression : expression",
  491. "$$11 :",
  492. "expression : named_expression ASSIGN_OP $$11 expression",
  493. "$$12 :",
  494. "expression : expression AND $$12 expression",
  495. "$$13 :",
  496. "expression : expression OR $$13 expression",
  497. "expression : NOT expression",
  498. "expression : expression REL_OP expression",
  499. "expression : expression '+' expression",
  500. "expression : expression '-' expression",
  501. "expression : expression MUL_OP expression",
  502. "expression : expression '^' expression",
  503. "expression : '-' expression",
  504. "expression : named_expression",
  505. "expression : NUMBER",
  506. "expression : '(' expression ')'",
  507. "expression : NAME '(' opt_argument_list ')'",
  508. "expression : INCR_DECR named_expression",
  509. "expression : named_expression INCR_DECR",
  510. "expression : Length '(' expression ')'",
  511. "expression : Sqrt '(' expression ')'",
  512. "expression : Scale '(' expression ')'",
  513. "expression : Read '(' ')'",
  514. "named_expression : NAME",
  515. "named_expression : NAME '[' expression ']'",
  516. "named_expression : Ibase",
  517. "named_expression : Obase",
  518. "named_expression : Scale",
  519. "named_expression : Last",
  520. };
  521. #endif
  522. #define yyclearin (yychar=(-1))
  523. #define yyerrok (yyerrflag=0)
  524. #ifdef YYSTACKSIZE
  525. #ifndef YYMAXDEPTH
  526. #define YYMAXDEPTH YYSTACKSIZE
  527. #endif
  528. #else
  529. #ifdef YYMAXDEPTH
  530. #define YYSTACKSIZE YYMAXDEPTH
  531. #else
  532. #define YYSTACKSIZE 500
  533. #define YYMAXDEPTH 500
  534. #endif
  535. #endif
  536. int yydebug;
  537. int yynerrs;
  538. int yyerrflag;
  539. int yychar;
  540. short *yyssp;
  541. YYSTYPE *yyvsp;
  542. YYSTYPE yyval;
  543. YYSTYPE yylval;
  544. short yyss[YYSTACKSIZE];
  545. YYSTYPE yyvs[YYSTACKSIZE];
  546. #define yystacksize YYSTACKSIZE
  547. #define YYABORT goto yyabort
  548. #define YYACCEPT goto yyaccept
  549. #define YYERROR goto yyerrlab
  550. int
  551. yyparse()
  552. {
  553.     register int yym, yyn, yystate;
  554. #if YYDEBUG
  555.     register char *yys;
  556.     extern char *getenv();
  557.  
  558.     if (yys = getenv("YYDEBUG"))
  559.     {
  560.         yyn = *yys;
  561.         if (yyn >= '0' && yyn <= '9')
  562.             yydebug = yyn - '0';
  563.     }
  564. #endif
  565.  
  566.     yynerrs = 0;
  567.     yyerrflag = 0;
  568.     yychar = (-1);
  569.  
  570.     yyssp = yyss;
  571.     yyvsp = yyvs;
  572.     *yyssp = yystate = 0;
  573.  
  574. yyloop:
  575.     if (yyn = yydefred[yystate]) goto yyreduce;
  576.     if (yychar < 0)
  577.     {
  578.         if ((yychar = yylex()) < 0) yychar = 0;
  579. #if YYDEBUG
  580.         if (yydebug)
  581.         {
  582.             yys = 0;
  583.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  584.             if (!yys) yys = "illegal-symbol";
  585.             printf("yydebug: state %d, reading %d (%s)\n", yystate,
  586.                     yychar, yys);
  587.         }
  588. #endif
  589.     }
  590.     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
  591.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  592.     {
  593. #if YYDEBUG
  594.         if (yydebug)
  595.             printf("yydebug: state %d, shifting to state %d\n",
  596.                     yystate, yytable[yyn]);
  597. #endif
  598.         if (yyssp >= yyss + yystacksize - 1)
  599.         {
  600.             goto yyoverflow;
  601.         }
  602.         *++yyssp = yystate = yytable[yyn];
  603.         *++yyvsp = yylval;
  604.         yychar = (-1);
  605.         if (yyerrflag > 0)  --yyerrflag;
  606.         goto yyloop;
  607.     }
  608.     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
  609.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  610.     {
  611.         yyn = yytable[yyn];
  612.         goto yyreduce;
  613.     }
  614.     if (yyerrflag) goto yyinrecovery;
  615. #ifdef lint
  616.     goto yynewerror;
  617. #endif
  618. yynewerror:
  619.     yyerror("syntax error");
  620. #ifdef lint
  621.     goto yyerrlab;
  622. #endif
  623. yyerrlab:
  624.     ++yynerrs;
  625. yyinrecovery:
  626.     if (yyerrflag < 3)
  627.     {
  628.         yyerrflag = 3;
  629.         for (;;)
  630.         {
  631.             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
  632.                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
  633.             {
  634. #if YYDEBUG
  635.                 if (yydebug)
  636.                     printf("yydebug: state %d, error recovery shifting\
  637.  to state %d\n", *yyssp, yytable[yyn]);
  638. #endif
  639.                 if (yyssp >= yyss + yystacksize - 1)
  640.                 {
  641.                     goto yyoverflow;
  642.                 }
  643.                 *++yyssp = yystate = yytable[yyn];
  644.                 *++yyvsp = yylval;
  645.                 goto yyloop;
  646.             }
  647.             else
  648.             {
  649. #if YYDEBUG
  650.                 if (yydebug)
  651.                     printf("yydebug: error recovery discarding state %d\n",
  652.                             *yyssp);
  653. #endif
  654.                 if (yyssp <= yyss) goto yyabort;
  655.                 --yyssp;
  656.                 --yyvsp;
  657.             }
  658.         }
  659.     }
  660.     else
  661.     {
  662.         if (yychar == 0) goto yyabort;
  663. #if YYDEBUG
  664.         if (yydebug)
  665.         {
  666.             yys = 0;
  667.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  668.             if (!yys) yys = "illegal-symbol";
  669.             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
  670.                     yystate, yychar, yys);
  671.         }
  672. #endif
  673.         yychar = (-1);
  674.         goto yyloop;
  675.     }
  676. yyreduce:
  677. #if YYDEBUG
  678.     if (yydebug)
  679.         printf("yydebug: state %d, reducing by rule %d (%s)\n",
  680.                 yystate, yyn, yyrule[yyn]);
  681. #endif
  682.     yym = yylen[yyn];
  683.     yyval = yyvsp[1-yym];
  684.     switch (yyn)
  685.     {
  686. case 1:
  687. #line 106 "bc.y"
  688. {
  689.                   yyval.i_value = 0;
  690.                   if (interactive)
  691.                 {
  692.                   printf ("%s\n", BC_VERSION);
  693.                   welcome ();
  694.                 }
  695.                 }
  696. break;
  697. case 3:
  698. #line 117 "bc.y"
  699. { run_code (); }
  700. break;
  701. case 4:
  702. #line 119 "bc.y"
  703. { run_code (); }
  704. break;
  705. case 5:
  706. #line 121 "bc.y"
  707. {
  708.                   yyerrok;
  709.                   init_gen ();
  710.                 }
  711. break;
  712. case 6:
  713. #line 127 "bc.y"
  714. { yyval.i_value = 0; }
  715. break;
  716. case 10:
  717. #line 133 "bc.y"
  718. { yyval.i_value = 0; }
  719. break;
  720. case 17:
  721. #line 142 "bc.y"
  722. { yyval.i_value = yyvsp[0].i_value; }
  723. break;
  724. case 18:
  725. #line 145 "bc.y"
  726. { warranty (""); }
  727. break;
  728. case 19:
  729. #line 147 "bc.y"
  730. { limits (); }
  731. break;
  732. case 20:
  733. #line 149 "bc.y"
  734. {
  735.                   if (yyvsp[0].i_value & 2)
  736.                 warn ("comparison in expression");
  737.                   if (yyvsp[0].i_value & 1)
  738.                 generate ("W");
  739.                   else 
  740.                 generate ("p");
  741.                 }
  742. break;
  743. case 21:
  744. #line 158 "bc.y"
  745. {
  746.                   yyval.i_value = 0;
  747.                   generate ("w");
  748.                   generate (yyvsp[0].s_value);
  749.                   free (yyvsp[0].s_value);
  750.                 }
  751. break;
  752. case 22:
  753. #line 165 "bc.y"
  754. {
  755.                   if (break_label == 0)
  756.                 yyerror ("Break outside a for/while");
  757.                   else
  758.                 {
  759.                   sprintf (genstr, "J%1d:", break_label);
  760.                   generate (genstr);
  761.                 }
  762.                 }
  763. break;
  764. case 23:
  765. #line 175 "bc.y"
  766. {
  767.                   warn ("Continue statement");
  768.                   if (continue_label == 0)
  769.                 yyerror ("Continue outside a for");
  770.                   else
  771.                 {
  772.                   sprintf (genstr, "J%1d:", continue_label);
  773.                   generate (genstr);
  774.                 }
  775.                 }
  776. break;
  777. case 24:
  778. #line 186 "bc.y"
  779. { exit (0); }
  780. break;
  781. case 25:
  782. #line 188 "bc.y"
  783. { generate ("h"); }
  784. break;
  785. case 26:
  786. #line 190 "bc.y"
  787. { generate ("0R"); }
  788. break;
  789. case 27:
  790. #line 192 "bc.y"
  791. { generate ("R"); }
  792. break;
  793. case 28:
  794. #line 194 "bc.y"
  795. {
  796.                   yyvsp[0].i_value = break_label; 
  797.                   break_label = next_label++;
  798.                 }
  799. break;
  800. case 29:
  801. #line 199 "bc.y"
  802. {
  803.                   if (yyvsp[-1].i_value > 1)
  804.                 warn ("Comparison in first for expression");
  805.                   yyvsp[-1].i_value = next_label++;
  806.                   if (yyvsp[-1].i_value < 0)
  807.                 sprintf (genstr, "N%1d:", yyvsp[-1].i_value);
  808.                   else
  809.                 sprintf (genstr, "pN%1d:", yyvsp[-1].i_value);
  810.                   generate (genstr);
  811.                 }
  812. break;
  813. case 30:
  814. #line 210 "bc.y"
  815. {
  816.                   if (yyvsp[-1].i_value < 0) generate ("1");
  817.                   yyvsp[-1].i_value = next_label++;
  818.                   sprintf (genstr, "B%1d:J%1d:", yyvsp[-1].i_value, break_label);
  819.                   generate (genstr);
  820.                   yyval.i_value = continue_label;
  821.                   continue_label = next_label++;
  822.                   sprintf (genstr, "N%1d:", continue_label);
  823.                   generate (genstr);
  824.                 }
  825. break;
  826. case 31:
  827. #line 221 "bc.y"
  828. {
  829.                   if (yyvsp[-1].i_value > 1)
  830.                 warn ("Comparison in third for expression");
  831.                   if (yyvsp[-1].i_value < 0)
  832.                 sprintf (genstr, "J%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value);
  833.                   else
  834.                 sprintf (genstr, "pJ%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value);
  835.                   generate (genstr);
  836.                 }
  837. break;
  838. case 32:
  839. #line 231 "bc.y"
  840. {
  841.                   sprintf (genstr, "J%1d:N%1d:",
  842.                        continue_label, break_label);
  843.                   generate (genstr);
  844.                   break_label = yyvsp[-12].i_value;
  845.                   continue_label = yyvsp[-4].i_value;
  846.                 }
  847. break;
  848. case 33:
  849. #line 239 "bc.y"
  850. {
  851.                   yyvsp[-1].i_value = if_label;
  852.                   if_label = next_label++;
  853.                   sprintf (genstr, "Z%1d:", if_label);
  854.                   generate (genstr);
  855.                 }
  856. break;
  857. case 34:
  858. #line 246 "bc.y"
  859. {
  860.                   sprintf (genstr, "N%1d:", if_label); 
  861.                   generate (genstr);
  862.                   if_label = yyvsp[-4].i_value;
  863.                 }
  864. break;
  865. case 35:
  866. #line 252 "bc.y"
  867. {
  868.                   yyvsp[0].i_value = next_label++;
  869.                   sprintf (genstr, "N%1d:", yyvsp[0].i_value);
  870.                   generate (genstr);
  871.                 }
  872. break;
  873. case 36:
  874. #line 258 "bc.y"
  875. {
  876.                   yyvsp[0].i_value = break_label; 
  877.                   break_label = next_label++;
  878.                   sprintf (genstr, "Z%1d:", break_label);
  879.                   generate (genstr);
  880.                 }
  881. break;
  882. case 37:
  883. #line 265 "bc.y"
  884. {
  885.                   sprintf (genstr, "J%1d:N%1d:", yyvsp[-6].i_value, break_label);
  886.                   generate (genstr);
  887.                   break_label = yyvsp[-3].i_value;
  888.                 }
  889. break;
  890. case 38:
  891. #line 271 "bc.y"
  892. { yyval.i_value = 0; }
  893. break;
  894. case 39:
  895. #line 273 "bc.y"
  896. {  warn ("print statement"); }
  897. break;
  898. case 43:
  899. #line 280 "bc.y"
  900. {
  901.                   generate ("O");
  902.                   generate (yyvsp[0].s_value);
  903.                   free (yyvsp[0].s_value);
  904.                 }
  905. break;
  906. case 44:
  907. #line 286 "bc.y"
  908. { generate ("P"); }
  909. break;
  910. case 46:
  911. #line 290 "bc.y"
  912. {
  913.                   warn ("else clause in if statement");
  914.                   yyvsp[0].i_value = next_label++;
  915.                   sprintf (genstr, "J%d:N%1d:", yyvsp[0].i_value, if_label); 
  916.                   generate (genstr);
  917.                   if_label = yyvsp[0].i_value;
  918.                 }
  919. break;
  920. case 48:
  921. #line 300 "bc.y"
  922. {
  923.                   /* Check auto list against parameter list? */
  924.                   check_params (yyvsp[-4].a_value,yyvsp[0].a_value);
  925.                   sprintf (genstr, "F%d,%s.%s[", lookup(yyvsp[-6].s_value,FUNCT), 
  926.                        arg_str (yyvsp[-4].a_value,TRUE), arg_str (yyvsp[0].a_value,TRUE));
  927.                   generate (genstr);
  928.                   free_args (yyvsp[-4].a_value);
  929.                   free_args (yyvsp[0].a_value);
  930.                   yyvsp[-7].i_value = next_label;
  931.                   next_label = 0;
  932.                 }
  933. break;
  934. case 49:
  935. #line 312 "bc.y"
  936. {
  937.                   generate ("0R]");
  938.                   next_label = yyvsp[-11].i_value;
  939.                 }
  940. break;
  941. case 50:
  942. #line 318 "bc.y"
  943. { yyval.a_value = NULL; }
  944. break;
  945. case 52:
  946. #line 322 "bc.y"
  947. { yyval.a_value = NULL; }
  948. break;
  949. case 53:
  950. #line 324 "bc.y"
  951. { yyval.a_value = yyvsp[-1].a_value; }
  952. break;
  953. case 54:
  954. #line 326 "bc.y"
  955. { yyval.a_value = yyvsp[-1].a_value; }
  956. break;
  957. case 55:
  958. #line 329 "bc.y"
  959. { yyval.a_value = nextarg (NULL, lookup (yyvsp[0].s_value,SIMPLE)); }
  960. break;
  961. case 56:
  962. #line 331 "bc.y"
  963. { yyval.a_value = nextarg (NULL, lookup (yyvsp[-2].s_value,ARRAY)); }
  964. break;
  965. case 57:
  966. #line 333 "bc.y"
  967. { yyval.a_value = nextarg (yyvsp[-2].a_value, lookup (yyvsp[0].s_value,SIMPLE)); }
  968. break;
  969. case 58:
  970. #line 335 "bc.y"
  971. { yyval.a_value = nextarg (yyvsp[-4].a_value, lookup (yyvsp[-2].s_value,ARRAY)); }
  972. break;
  973. case 59:
  974. #line 338 "bc.y"
  975. { yyval.a_value = NULL; }
  976. break;
  977. case 61:
  978. #line 342 "bc.y"
  979. {
  980.                   if (yyvsp[0].i_value > 1) warn ("comparison in argument");
  981.                   yyval.a_value = nextarg (NULL,0);
  982.                 }
  983. break;
  984. case 62:
  985. #line 347 "bc.y"
  986. {
  987.                   sprintf (genstr, "K%d:", -lookup (yyvsp[-2].s_value,ARRAY));
  988.                   generate (genstr);
  989.                   yyval.a_value = nextarg (NULL,1);
  990.                 }
  991. break;
  992. case 63:
  993. #line 353 "bc.y"
  994. {
  995.                   if (yyvsp[0].i_value > 1) warn ("comparison in argument");
  996.                   yyval.a_value = nextarg (yyvsp[-2].a_value,0);
  997.                 }
  998. break;
  999. case 64:
  1000. #line 358 "bc.y"
  1001. {
  1002.                   sprintf (genstr, "K%d:", -lookup (yyvsp[-2].s_value,ARRAY));
  1003.                   generate (genstr);
  1004.                   yyval.a_value = nextarg (yyvsp[-4].a_value,1);
  1005.                 }
  1006. break;
  1007. case 65:
  1008. #line 365 "bc.y"
  1009. {
  1010.                   yyval.i_value = -1;
  1011.                   warn ("Missing expression in for statement");
  1012.                 }
  1013. break;
  1014. case 67:
  1015. #line 372 "bc.y"
  1016. {
  1017.                   yyval.i_value = 0;
  1018.                   generate ("0");
  1019.                 }
  1020. break;
  1021. case 68:
  1022. #line 377 "bc.y"
  1023. {
  1024.                   if (yyvsp[0].i_value > 1)
  1025.                 warn ("comparison in return expresion");
  1026.                 }
  1027. break;
  1028. case 69:
  1029. #line 383 "bc.y"
  1030. {
  1031.                   if (yyvsp[0].c_value != '=')
  1032.                 {
  1033.                   if (yyvsp[-1].i_value < 0)
  1034.                     sprintf (genstr, "DL%d:", -yyvsp[-1].i_value);
  1035.                   else
  1036.                     sprintf (genstr, "l%d:", yyvsp[-1].i_value);
  1037.                   generate (genstr);
  1038.                 }
  1039.                 }
  1040. break;
  1041. case 70:
  1042. #line 394 "bc.y"
  1043. {
  1044.                   if (yyvsp[0].i_value > 1) warn("comparison in assignment");
  1045.                   if (yyvsp[-2].c_value != '=')
  1046.                 {
  1047.                   sprintf (genstr, "%c", yyvsp[-2].c_value);
  1048.                   generate (genstr);
  1049.                 }
  1050.                   if (yyvsp[-3].i_value < 0)
  1051.                 sprintf (genstr, "S%d:", -yyvsp[-3].i_value);
  1052.                   else
  1053.                 sprintf (genstr, "s%d:", yyvsp[-3].i_value);
  1054.                   generate (genstr);
  1055.                   yyval.i_value = 0;
  1056.                 }
  1057. break;
  1058. case 71:
  1059. #line 410 "bc.y"
  1060. {
  1061.                   warn("&& operator");
  1062.                   yyvsp[0].i_value = next_label++;
  1063.                   sprintf (genstr, "DZ%d:p", yyvsp[0].i_value);
  1064.                   generate (genstr);
  1065.                 }
  1066. break;
  1067. case 72:
  1068. #line 417 "bc.y"
  1069. {
  1070.                   sprintf (genstr, "DZ%d:p1N%d:", yyvsp[-2].i_value, yyvsp[-2].i_value);
  1071.                   generate (genstr);
  1072.                   yyval.i_value = yyvsp[-3].i_value | yyvsp[0].i_value;
  1073.                 }
  1074. break;
  1075. case 73:
  1076. #line 423 "bc.y"
  1077. {
  1078.                   warn("|| operator");
  1079.                   yyvsp[0].i_value = next_label++;
  1080.                   sprintf (genstr, "B%d:", yyvsp[0].i_value);
  1081.                   generate (genstr);
  1082.                 }
  1083. break;
  1084. case 74:
  1085. #line 430 "bc.y"
  1086. {
  1087.                   int tmplab;
  1088.                   tmplab = next_label++;
  1089.                   sprintf (genstr, "B%d:0J%d:N%d:1N%d:",
  1090.                        yyvsp[-2].i_value, tmplab, yyvsp[-2].i_value, tmplab);
  1091.                   generate (genstr);
  1092.                   yyval.i_value = yyvsp[-3].i_value | yyvsp[0].i_value;
  1093.                 }
  1094. break;
  1095. case 75:
  1096. #line 439 "bc.y"
  1097. {
  1098.                   yyval.i_value = yyvsp[0].i_value;
  1099.                   warn("! operator");
  1100.                   generate ("!");
  1101.                 }
  1102. break;
  1103. case 76:
  1104. #line 445 "bc.y"
  1105. {
  1106.                   yyval.i_value = 3;
  1107.                   switch (*(yyvsp[-1].s_value))
  1108.                 {
  1109.                 case '=':
  1110.                   generate ("=");
  1111.                   break;
  1112.  
  1113.                 case '!':
  1114.                   generate ("#");
  1115.                   break;
  1116.  
  1117.                 case '<':
  1118.                   if (yyvsp[-1].s_value[1] == '=')
  1119.                     generate ("{");
  1120.                   else
  1121.                     generate ("<");
  1122.                   break;
  1123.  
  1124.                 case '>':
  1125.                   if (yyvsp[-1].s_value[1] == '=')
  1126.                     generate ("}");
  1127.                   else
  1128.                     generate (">");
  1129.                   break;
  1130.                 }
  1131.                 }
  1132. break;
  1133. case 77:
  1134. #line 473 "bc.y"
  1135. {
  1136.                   generate ("+");
  1137.                   yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value;
  1138.                 }
  1139. break;
  1140. case 78:
  1141. #line 478 "bc.y"
  1142. {
  1143.                   generate ("-");
  1144.                   yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value;
  1145.                 }
  1146. break;
  1147. case 79:
  1148. #line 483 "bc.y"
  1149. {
  1150.                   genstr[0] = yyvsp[-1].c_value;
  1151.                   genstr[1] = 0;
  1152.                   generate (genstr);
  1153.                   yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value;
  1154.                 }
  1155. break;
  1156. case 80:
  1157. #line 490 "bc.y"
  1158. {
  1159.                   generate ("^");
  1160.                   yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value;
  1161.                 }
  1162. break;
  1163. case 81:
  1164. #line 495 "bc.y"
  1165. {
  1166.                   generate ("n");
  1167.                   yyval.i_value = yyvsp[0].i_value;
  1168.                 }
  1169. break;
  1170. case 82:
  1171. #line 500 "bc.y"
  1172. {
  1173.                   yyval.i_value = 1;
  1174.                   if (yyvsp[0].i_value < 0)
  1175.                 sprintf (genstr, "L%d:", -yyvsp[0].i_value);
  1176.                   else
  1177.                 sprintf (genstr, "l%d:", yyvsp[0].i_value);
  1178.                   generate (genstr);
  1179.                 }
  1180. break;
  1181. case 83:
  1182. #line 509 "bc.y"
  1183. {
  1184.                   int len = strlen(yyvsp[0].s_value);
  1185.                   yyval.i_value = 1;
  1186.                   if (len == 1 && *yyvsp[0].s_value == '0')
  1187.                 generate ("0");
  1188.                   else if (len == 1 && *yyvsp[0].s_value == '1')
  1189.                 generate ("1");
  1190.                   else
  1191.                 {
  1192.                   generate ("K");
  1193.                   generate (yyvsp[0].s_value);
  1194.                   generate (":");
  1195.                 }
  1196.                   free (yyvsp[0].s_value);
  1197.                 }
  1198. break;
  1199. case 84:
  1200. #line 525 "bc.y"
  1201. { yyval.i_value = yyvsp[-1].i_value | 1; }
  1202. break;
  1203. case 85:
  1204. #line 527 "bc.y"
  1205. {
  1206.                   yyval.i_value = 1;
  1207.                   if (yyvsp[-1].a_value != NULL)
  1208.                 { 
  1209.                   sprintf (genstr, "C%d,%s:",
  1210.                        lookup (yyvsp[-3].s_value,FUNCT),
  1211.                        arg_str (yyvsp[-1].a_value,FALSE));
  1212.                   free_args (yyvsp[-1].a_value);
  1213.                 }
  1214.                   else
  1215.                 {
  1216.                   sprintf (genstr, "C%d:", lookup (yyvsp[-3].s_value,FUNCT));
  1217.                 }
  1218.                   generate (genstr);
  1219.                 }
  1220. break;
  1221. case 86:
  1222. #line 543 "bc.y"
  1223. {
  1224.                   yyval.i_value = 1;
  1225.                   if (yyvsp[0].i_value < 0)
  1226.                 {
  1227.                   if (yyvsp[-1].c_value == '+')
  1228.                     sprintf (genstr, "DA%d:L%d:", -yyvsp[0].i_value, -yyvsp[0].i_value);
  1229.                   else
  1230.                     sprintf (genstr, "DM%d:L%d:", -yyvsp[0].i_value, -yyvsp[0].i_value);
  1231.                 }
  1232.                   else
  1233.                 {
  1234.                   if (yyvsp[-1].c_value == '+')
  1235.                     sprintf (genstr, "i%d:l%d:", yyvsp[0].i_value, yyvsp[0].i_value);
  1236.                   else
  1237.                     sprintf (genstr, "d%d:l%d:", yyvsp[0].i_value, yyvsp[0].i_value);
  1238.                 }
  1239.                   generate (genstr);
  1240.                 }
  1241. break;
  1242. case 87:
  1243. #line 562 "bc.y"
  1244. {
  1245.                   yyval.i_value = 1;
  1246.                   if (yyvsp[-1].i_value < 0)
  1247.                 {
  1248.                   sprintf (genstr, "DL%d:x", -yyvsp[-1].i_value);
  1249.                   generate (genstr); 
  1250.                   if (yyvsp[0].c_value == '+')
  1251.                     sprintf (genstr, "A%d:", -yyvsp[-1].i_value);
  1252.                   else
  1253.                       sprintf (genstr, "M%d:", -yyvsp[-1].i_value);
  1254.                 }
  1255.                   else
  1256.                 {
  1257.                   sprintf (genstr, "l%d:", yyvsp[-1].i_value);
  1258.                   generate (genstr);
  1259.                   if (yyvsp[0].c_value == '+')
  1260.                     sprintf (genstr, "i%d:", yyvsp[-1].i_value);
  1261.                   else
  1262.                     sprintf (genstr, "d%d:", yyvsp[-1].i_value);
  1263.                 }
  1264.                   generate (genstr);
  1265.                 }
  1266. break;
  1267. case 88:
  1268. #line 585 "bc.y"
  1269. { generate ("cL"); yyval.i_value = 1;}
  1270. break;
  1271. case 89:
  1272. #line 587 "bc.y"
  1273. { generate ("cR"); yyval.i_value = 1;}
  1274. break;
  1275. case 90:
  1276. #line 589 "bc.y"
  1277. { generate ("cS"); yyval.i_value = 1;}
  1278. break;
  1279. case 91:
  1280. #line 591 "bc.y"
  1281. {
  1282.                   warn ("read function");
  1283.                   generate ("cI"); yyval.i_value = 1;
  1284.                 }
  1285. break;
  1286. case 92:
  1287. #line 597 "bc.y"
  1288. { yyval.i_value = lookup(yyvsp[0].s_value,SIMPLE); }
  1289. break;
  1290. case 93:
  1291. #line 599 "bc.y"
  1292. {
  1293.                   if (yyvsp[-1].i_value > 1) warn("comparison in subscript");
  1294.                   yyval.i_value = lookup(yyvsp[-3].s_value,ARRAY);
  1295.                 }
  1296. break;
  1297. case 94:
  1298. #line 604 "bc.y"
  1299. { yyval.i_value = 0; }
  1300. break;
  1301. case 95:
  1302. #line 606 "bc.y"
  1303. { yyval.i_value = 1; }
  1304. break;
  1305. case 96:
  1306. #line 608 "bc.y"
  1307. { yyval.i_value = 2; }
  1308. break;
  1309. case 97:
  1310. #line 610 "bc.y"
  1311. { yyval.i_value = 3; }
  1312. break;
  1313. #line 1314 "y.tab.c"
  1314.     }
  1315.     yyssp -= yym;
  1316.     yystate = *yyssp;
  1317.     yyvsp -= yym;
  1318.     yym = yylhs[yyn];
  1319.     if (yystate == 0 && yym == 0)
  1320.     {
  1321. #if YYDEBUG
  1322.         if (yydebug)
  1323.             printf("yydebug: after reduction, shifting from state 0 to\
  1324.  state %d\n", YYFINAL);
  1325. #endif
  1326.         yystate = YYFINAL;
  1327.         *++yyssp = YYFINAL;
  1328.         *++yyvsp = yyval;
  1329.         if (yychar < 0)
  1330.         {
  1331.             if ((yychar = yylex()) < 0) yychar = 0;
  1332. #if YYDEBUG
  1333.             if (yydebug)
  1334.             {
  1335.                 yys = 0;
  1336.                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  1337.                 if (!yys) yys = "illegal-symbol";
  1338.                 printf("yydebug: state %d, reading %d (%s)\n",
  1339.                         YYFINAL, yychar, yys);
  1340.             }
  1341. #endif
  1342.         }
  1343.         if (yychar == 0) goto yyaccept;
  1344.         goto yyloop;
  1345.     }
  1346.     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
  1347.             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
  1348.         yystate = yytable[yyn];
  1349.     else
  1350.         yystate = yydgoto[yym];
  1351. #if YYDEBUG
  1352.     if (yydebug)
  1353.         printf("yydebug: after reduction, shifting from state %d \
  1354. to state %d\n", *yyssp, yystate);
  1355. #endif
  1356.     if (yyssp >= yyss + yystacksize - 1)
  1357.     {
  1358.         goto yyoverflow;
  1359.     }
  1360.     *++yyssp = yystate;
  1361.     *++yyvsp = yyval;
  1362.     goto yyloop;
  1363. yyoverflow:
  1364.     yyerror("yacc stack overflow");
  1365. yyabort:
  1366.     return (1);
  1367. yyaccept:
  1368.     return (0);
  1369. }
  1370.